package socketmvc.core.packets.basic;

import socketmvc.core.util.TypeReference;

import java.io.InputStream;
import java.lang.reflect.Type;

public sealed interface IPacket extends IProtocolPacket,ICommandPacket,IAttrPacket permits JsonBasicPacket {

    /**
     * 获取文本段正文内容
     * 将正文内容解析成string返回
     * @return string类型的正文内容
     */
    String getTextBodyAsStr();

    /**
     * 获取文本段正文内容
     * 将正文内容解析成json对象返回
     * @return jsonObj
     */
    TextBody getTextBodyAsObj();

    /**
     * 获取二进制段正文内容
     * @return inputStream
     */
    InputStream getBinBodyAsStream();

    /**
     * 获取二进制段正文内容
     * @return bytes
     */
    byte[] getBinBodyAsBytes();

    /**
     * 将pkt转换成java object
     * @param type java类型
     * @return object
     * @param <T> 泛型
     */
    default <T> T toBean(Class<T> type){
        return getTextBodyAsObj().toJavaObject(type);
    }

    /**
     * 将pkt转换成java object
     * @param type java类型
     * @return object
     * @param <T> 泛型
     */
    default <T> T toBean(Type type){
        return getTextBodyAsObj().toJavaObject(type);
    }

    /**
     * 将pkt转换成java object
     * @param type java类型
     * @return object
     * @param <T> 泛型
     */
    default <T> T toBean(TypeReference<T> type){
        return getTextBodyAsObj().toJavaObject(type);
    }

}
